
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2008, Adam Kubach
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

#include "Minerva/Core/Data/ColorStyle.h"

#include "Usul/Adaptors/Random.h"

#include <cstdlib>
#include <ctime>

using namespace Minerva::Core::Data;


///////////////////////////////////////////////////////////////////////////////
//
//  Constructor.
//
///////////////////////////////////////////////////////////////////////////////

ColorStyle::ColorStyle() : BaseClass(),
  _color ( 1.0, 1.0, 1.0, 1.0 ),
  _mode ( NORMAL )
{
  this->_addMember ( "color", _color );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Destructor.
//
///////////////////////////////////////////////////////////////////////////////

ColorStyle::~ColorStyle()
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Set the color.
//
///////////////////////////////////////////////////////////////////////////////

void ColorStyle::color ( const Color& c )
{
  Guard guard ( this->mutex() );
	_color = c;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the color.
//
///////////////////////////////////////////////////////////////////////////////

const ColorStyle::Color& ColorStyle::color() const
{
  Guard guard ( this->mutex() );
	return _color;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Set the mode.
//
///////////////////////////////////////////////////////////////////////////////

void ColorStyle::mode ( ColorMode m )
{
  Guard guard ( this->mutex() );
  _mode = m;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the mode.
//
///////////////////////////////////////////////////////////////////////////////

ColorStyle::ColorMode ColorStyle::mode() const
{
  Guard guard ( this->mutex() );
  return _mode;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Make a random color.
//
///////////////////////////////////////////////////////////////////////////////

ColorStyle::Color ColorStyle::makeRandomColor ( const Color& c)
{
  Minerva::Core::Data::ColorStyle::Color color ( c );
  
  ::srand ( static_cast<unsigned int> ( ::time ( 0 ) ) );
  Usul::Adaptors::Random<float> random ( 0.0, 1.0 );
  color[0] = c[0] * random();
  color[1] = c[1] * random();
  color[2] = c[2] * random();
  
  return color;
}
